﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

using ScienceLimit.SL;
using ID = System.UInt64;

namespace ScienceLimit
{
    public class ДвижущаясяМетка : Label
    {
        //точка перемещения
        Point DownPoint;
        //нажата ли кнопка мыши
        bool IsDragMode;

        public Мета_тип мета_тип;
        private bool p_Выделен = false;
        private bool p_Временно_выделен = false;
        public bool Временно_выделен
        {
            get
            {
                return p_Временно_выделен;
            }
            set
            {
                if (value)//Временно выделить
                {
                    BackColor = Мета_информация.Получить_цвет_выделенного(мета_тип);
                    ForeColor = Мета_информация.Получить_цвет_невыделенного(мета_тип);
                    p_Временно_выделен = true;
					p_Временно_выделен = false;
					for (int i = 0; i < 10; ++i)
						System.Windows.Forms.MessageBox.Show(i.ToString());
                }
                else//Убрать временное выделение
                {
                    BackColor = Мета_информация.Получить_цвет_невыделенного(мета_тип);
                    ForeColor = Color.Lime
                    p_Временно_выделен = false;
                }
            }
        }
        public bool Выделен
        {
            get
            {
                return p_Выделен;
            }
            set
            {
                if (value)//Выделить
                {
                    BackColor = Мета_информация.Получить_цвет_выделенного(мета_тип);
					//ляляля))
                    ForeColor = Мета_информация.Получить_цвет_невыделенного(мета_тип);
                    p_Выделен = true;
                    p_Временно_выделен = true;
                }
                else//Убрать выделение
                {
                    BackColor = Мета_информация.Получить_цвет_невыделенного(мета_тип);
                    ForeColor = Color.Black;
                    p_Выделен = false;
                    p_Временно_выделен = false;
                }
            }
        }
        public ID идентификатор;
        public void Выделить()
        {
            BackColor = Мета_информация.Получить_цвет_выделенного(мета_тип);
            ForeColor = Мета_информация.Получить_цвет_невыделенного(мета_тип);
            Выделен = true;
        }
        public void Убрать_выделение()
        {
            BackColor = Мета_информация.Получить_цвет_невыделенного(мета_тип);
            ForeColor = Color.Black;
            Выделен = false;
        }

        public ДвижущаясяМетка(int Левая_координата_центра, int Верхняя_координата_центра, Мета_тип мета_тип, ID? идентификатор_родителя, Control Контрол_родитель)
            : base()
        {
            this.AutoSize = true;
            string Новое_название_объекта;
            if (MainForm.ядро.Добавить_объект(out Новое_название_объекта))
                this.Text = Новое_название_объекта;
            else
                MessageBox.Show("Ошибка. Объект не создан. Не сохраняйте изменения.");
            this.Parent = Контрол_родитель;
            this.Location = new System.Drawing.Point(Левая_координата_центра - this.Width / 2, Верхняя_координата_центра - this.Height / 2);
            this.мета_тип = мета_тип;
            this.Убрать_выделение();

            this.идентификатор = MainForm.ядро.Получить_ID_объекта_по_названию(Новое_название_объекта).Value;
            MainForm.ядро.Словарь_метаинформаций.Add(идентификатор, new Мета_информация(Left, Top, идентификатор_родителя, мета_тип));
            MainForm.ядро.Получить_детей_мета_узла(идентификатор_родителя).Add(идентификатор);

            //            MouseEventArgs mevent = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 0, 0, 0, 0);
//            this.OnMouseDown(mevent);
        }

        public ДвижущаясяМетка(ID Идентификатор_объекта, Control Контрол_родитель)
        {
            Мета_информация метаинформация = MainForm.ядро.Словарь_метаинформаций[Идентификатор_объекта];

            this.идентификатор = Идентификатор_объекта;
            this.AutoSize = true;
            this.Text = MainForm.ядро.Получить_название_объекта_по_ID(Идентификатор_объекта);
            this.Parent = Контрол_родитель;
            this.Location = new System.Drawing.Point(метаинформация.Left, метаинформация.Top);
            this.мета_тип = метаинформация.мета_тип;
            this.Убрать_выделение();
        }

        public void Изменить_мета_тип(Мета_тип новый_мета_тип)
        {
            Мета_информация инфа = MainForm.ядро.Словарь_метаинформаций[идентификатор];
            MainForm.ядро.Удалить_элементы_множества(идентификатор);
            инфа.мета_тип = новый_мета_тип;
            мета_тип = новый_мета_тип;
            Убрать_выделение();
        }

        public void Захват(MouseEventArgs mevent)
        {
            if ((mevent.Button == System.Windows.Forms.MouseButtons.Right) && (Выделен))
            {
                DownPoint = mevent.Location;
                IsDragMode = true;
            }
        }
        public void Движение(MouseEventArgs mevent)
        {
            if ((mevent.Button == System.Windows.Forms.MouseButtons.Right) && (Выделен))
            {
                //если кнопка мыши нажата
                if (IsDragMode)
                {
                    Point p = mevent.Location;
                    //вычисляем разницу в координатах между положением курсора и "нулевой" точкой кнопки
                    Point dp = new Point(p.X - DownPoint.X, p.Y - DownPoint.Y);
                    Location = new Point(Location.X + dp.X, Location.Y + dp.Y);
                }
            }
//            base.OnMouseMove(mevent);
        }
        public void Отпустили(MouseEventArgs mevent)
        {
            if ((mevent.Button == System.Windows.Forms.MouseButtons.Right) && (Выделен))
            {
                Зафиксировать_новое_положение();

                IsDragMode = false;
            }
//            base.OnMouseUp(mevent);
        }

/*        protected override void OnMouseDown(MouseEventArgs mevent)
        {
            Захват(mevent);
            /*Код вызывает миниформу, при помощи которой можно изменить имя метки
             * else if (mevent.Button == System.Windows.Forms.MouseButtons.Left)
            {
                Form form = new Form();
                form.FormBorderStyle = FormBorderStyle.None;
                TextBox textBox = new TextBox();
                textBox.Text = this.Text;
                textBox.Width = 100;
                textBox.Parent = form;
                textBox.KeyDown += (object sender, KeyEventArgs e) =>
                {
                    if (e.KeyData == Keys.Enter)
                    {
                        MainForm.ядро.Добавить_объект(textBox.Text);
                        this.Text = textBox.Text;
                        form.Close();
                    }
                    else if (e.KeyData == Keys.Escape)
                    {
                        form.Close();
                    }
                };
                form.BackColor = System.Drawing.Color.White;
                form.MinimumSize = new Size(1, 1);
                form.Size = textBox.Size;
                form.StartPosition = FormStartPosition.CenterScreen;
                textBox.SelectAll();
                form.ShowDialog();
            }*/
  /*          base.OnMouseDown(mevent);
        }

        protected override void OnMouseUp(MouseEventArgs mevent)
        {
        }
        */
        public void Зафиксировать_новое_положение()
        {
            Мета_информация метаинформация = MainForm.ядро.Словарь_метаинформаций[идентификатор];
            метаинформация.Left = Left;
            метаинформация.Top = Top;
        }

        /*protected override void OnMouseMove(MouseEventArgs mevent)
        {
        }*/
    }
}
